// #pragma

// #include <Windows/SharedMemory.hpp>
// #include "SharedData.hpp"
// #include "Windows/ProcessInformation.hpp"
// #include "Windows/WinProcess.hpp"
// #include "Windows/Dialog.hpp"
// #include <future>
// #include <stdexcept>
// #include <string>

// class DaemonProcessException : public std::runtime_error
// {
// public:
//     explicit DaemonProcessException(const std::string &message, int pid = -1)
//         : std::runtime_error(message + " (PID: " + std::to_string(pid) + ")"),
//           processId(pid) {}

//     const int processId;
// };

// class GuardProcess : public std::enable_shared_from_this<GuardProcess>
// {
// private:
//     std::unique_ptr<CppWinApi::Windows::SharedMemory<SharedData>> mSharedMemory;
//     std::string mUUID;
    
//     /// @brief 启动进程守卫
//     /// @return 返回进程信息
//     ProcessInformation LaunchDaemonProcess()
//     {
//         // 启动守护进程
//         auto pi = CppWinApi::Windows::WinProcess::ForkBackgroundProcess(
//             std::string("launch-daemon-process-from-guard") + " " + mUUID);

//         // 指数退避等待策略：1000ms, 2000ms, 4000ms
//         for (int wait = 1000, count = 0; count <= 2; wait *= 2, ++count)
//         {
//             // 等待进程启动
//             auto waitResult = CppWinApi::Windows::WinProcess::WaitProcessExit(
//                 pi.GetProcessId(), wait);

//             if (waitResult == WAIT_ABANDONED)
//             {
//                 throw DaemonProcessException(
//                     "Daemon process terminated unexpectedly",
//                     pi.GetProcessId());
//             }

//             // 检查守护进程是否已正常运行
//             if (mSharedMemory->Get().DaemonProcessIsRunning)
//             {
//                 return pi;
//             }
//         }

//         // 三次尝试后仍未成功
//         throw DaemonProcessException(
//             "Daemon process startup timeout",
//             pi.GetProcessId());
//     }

// public:
//     GuardProcess(const std::string &uuid)
//     {
//         if (uuid.empty())
//             throw std::invalid_argument("Parameter 'id' cannot be empty");
//         mSharedMemory = CppWinApi::Windows::SharedMemory<SharedData>::Create(uuid);
//         mUUID = uuid;

//         // 设置保护进程运行状态
//         mSharedMemory->Set([](SharedData *data)
//                            { 
//                                 data->GuardProcessIsRunning = true; 
//                                 data->GuardProcessId = ::GetCurrentProcessId(); });
//     }

//     /// @brief 守护进程守卫
//     /// @return 返回异步等待
//     std::future<void> ProtectingDaemonProcessAsync()
//     {
//         auto self = shared_from_this();
//         return std::async(std::launch::async, [self]()
//                           {
//         do
//         {
//              // 等待守护进程退出
//             CppWinApi::Windows::WinProcess::WaitProcessExit(self->mSharedMemory->Get().DaemonProcessId);

//             // 设置守护进程状态
//             self->mSharedMemory->Set([](SharedData* data){
//                 data->DaemonProcessIsRunning = false;
//             });


//             if (self->mSharedMemory->Get().DaemonProcessIsNeedToExit)
//             {
//                 // 如果守护进程需要退出，则终止进程
//                 break;
//             }
    
//             // 否则重启守护进程
//             auto pi = self->LaunchDaemonProcess();

//             CppWinApi::Windows::Dialog::Show("create new daemon process.");
//         } while (true); });
//     }
// };